package com.leetcode;

import java.util.HashMap;
import java.util.Map;

public class Leetcode169 {

    /*
    利用游戏规则：“你可以假设数组是非空的，并且给定的数组总是存在多数元素。”
    先排序，在存在多数元素的情况下，那么不管多数是排在前面一半，还是排在后面一半，中间的位置必然是多数。
    public int majorityElement(int[] nums) {
        Arrays.sort(nums);
        return nums[nums.length/2];
    }
*/

    //思路：
    //先用哈希表统计所有的元素重复的次数
    //然后用 for 循环比较出次数最多的元素
    //最后再将该元素返回
    //时间复杂度：O(N): 哈希表统计O(N),for循环访问哈希表O（N)*O(1）=O(N)
    //空间复杂度：O(N)
    public int majorityElement(int[] nums) {
        int len = nums.length;
        Map<Integer, Integer> numsMap = countNums(nums);
        Map.Entry<Integer, Integer> majorityEntry = null;
        for (Map.Entry<Integer, Integer> entry : numsMap.entrySet()) {
            if(majorityEntry ==null || entry.getValue() > majorityEntry.getValue()){
                majorityEntry = entry;
            }
        }

        return majorityEntry.getKey();
    }

    private Map<Integer, Integer> countNums(int[] nums) {
        Map<Integer, Integer> numsMap = new HashMap<>();
        for(int i=0; i<nums.length; i++){
            numsMap.put(nums[i],numsMap.getOrDefault(nums[i],0)+1);
        }

        return numsMap;
    }

    public static void main(String[] args){
        Leetcode169 leetcode169  = new Leetcode169();
        int[] nums = new int[]{2,2,1,1,1,2,2};
        System.out.println(leetcode169.majorityElement(nums));
    }
}
